import java.io.File;
import java.util.concurrent.ArrayBlockingQueue;

/**
 * @author fsyj
 */
public class FileReplaceUtil {

    /**
     * 修改思路，由于文件读写是阻塞操作，如果串行读写，在进行大文件的操作时，将会导致耗时急剧增加
     * 使用阻塞队列，将读操作作为数据生产者，将修改操作作为消费者
     * 此处默认文件编码格式为 UTF-8 编码，
     * UTF-8 使用的是可变长字节，所以一个字符的字节数据可能存在两个不同的字节数组中
     * 由此，只使用了一个消费者线程，
     * 对此，还有优化思路，使用多个生产者，并使用有序阻塞队列，保证文件字节数组有序
     * 性能瓶颈主要还是在消费者这边
     * 此处由于刚好需要替代的字符是 1 字节的，每个字符一定是以 0 开始的，详情参见
     * @see <a href="https://blog.csdn.net/qq_46599129/article/details/122884216"/>
     * 所以只针对此例，消费者也可以有多个，只需要对每个字节进行判断即可
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        String filePath = "some file";
        File file = new File(filePath);
        ArrayBlockingQueue<IndexedData> queue = new ArrayBlockingQueue<>(16);
        FileByteProducer producer = new FileByteProducer(queue, file);
        FileByteConsumer consumer = new FileByteConsumer(queue, file);
        producer.start();
        consumer.start();
        producer.join();
        consumer.join();
    }
}
